#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<signal.h>
using namespace std;
void MyDaemon()
{
    //忽略信号：SIGPIPE,SIGCHLD
    signal(SIGPIPE,SIG_IGN);
    signal(SIGCHLD,SIG_IGN);
    
    //不要让自己成为进程组组长
    if(fork() > 0)  //父进程直接退出，子进程成为孤儿进程
        exit(0);
    
    //调用sedsid创建新会话,使子进程摆脱原会话的控制,保证守护进程和终端分离,独立于终端的生命周期
    setsid();
    
    //改变工作目录到根目录,这样不会影响其他文件系统的卸载
    //chdir("/");
    
    //重新设置文件权限掩码，增强守护进程的灵活性，使其能够自由创建文件
    umask(0);
    
    
    
    //将标准输入/标准输出/标准错误重定向到文件黑洞,这样守护进程在打印信息的时候不会直接显示到终端上
    int devnull = open("/dev/null",O_RDONLY | O_WRONLY);
    if(devnull > 0)
    {
        //dup2(oldfd,newfd) 最终都重定向到oldfd当中
        dup2(devnull,0);
        dup2(devnull,1);
        dup2(devnull,2);
        close(devnull);
    }

    int fd = open("./log.txt",O_RDWR);
    while(1)
    {
        const char* str = "Hello Mango\n";
        write(fd,str,strlen(str));
        sleep(3);
    }
}
int main()
{
    MyDaemon();
    return 0;
}